/**
 * @Author: zhongyang
 * @Date: 2022/6/27 15:03
 */

package main

import "fmt"

/**
09_代理模式
概念：为其他对象提供一种代理以控制对这个对象的访问。
就是将代理的入口暴露给用户，通过代理对象去调用真实对象的方法。
*/

type Subject interface {
	Do() string
}

type RealSubject struct {
}

func (r *RealSubject) Do() string {
	return "执行真实功能"
}

type ProxySubject struct {
	RealSubject
	money int
}

func (p *ProxySubject) Do() string {
	if p.money > 0 {
		return p.RealSubject.Do()
	} else {
		return "费用不足"
	}
}

func main() {
	sub := &ProxySubject{
		RealSubject: RealSubject{},
		money:       10,
	}
	fmt.Println(sub.Do())
}
